/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package feuerwehr;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
import javax.swing.JOptionPane;

/**
 *
 * @author GundlaPe
 */
public class Feuerwehr implements Runnable {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        String iniFile = "feuerwehr.ini";
        if (args.length > 0) 
            iniFile = args[0];
        new Feuerwehr(iniFile);
    }
    
    @SuppressWarnings("CallToThreadStartDuringObjectConstruction")
    public Feuerwehr(String iniFile) {
        ReadParameter.readFromFile(iniFile);
        if (!ReadParameter.getParameter("phost").equals("")) {
            System.setProperty("http.proxyHost", ReadParameter.getParameter("phost"));
            System.setProperty("http.proxyPort", ReadParameter.getParameter("pport"));
        }
        conn = getNewConnection();
        maxSequence = Einsatz.getSequence();
        
        Authenticate authenticate = new Authenticate();        // Passwort - Dialog anzeigen
        authenticate.setVisible(true);
        if (pBenutzer == null) {
            System.exit(1);
        }
        
        new Thread(this).start();
        
        if (authenticate.getSelectedValue().equals("Ändern") || authenticate.getSelectedValue().equals("Alle")) { 
            anzeigeEinsatz = new AnzeigeEinsatz();
            anzeigeEinsatz.setVisible(true);
        }
        
        if (authenticate.getSelectedValue().equals("Anzeige") || authenticate.getSelectedValue().equals("Alle")) {
            einsatzTabelle = new EinsatzTabelle();
            einsatzTabelle.setVisible(true);
        }

        if (anzeigeEinsatz != null)
            anzeigeEinsatz.setEinsatzTabelle(einsatzTabelle);
        if (einsatzTabelle != null)
            einsatzTabelle.setAnzeigeEinsatz(anzeigeEinsatz);
    }

    /**
     * Datenbankverbindung aufbauen
     * @return Connection zur Datenbank
     */
    private Connection getNewConnection() {
        if (conn==null) {
            try {
                Class.forName("com.mysql.jdbc.Driver");
                conn = (Connection) DriverManager.getConnection(ReadParameter.getParameter("url"), ReadParameter.getParameter("user"), ReadParameter.getParameter("pass"));
                conn.setAutoCommit(true);
            } catch (ClassNotFoundException | SQLException exc) {
                System.err.println("ERROR: " + exc.toString());
                JOptionPane.showMessageDialog(null, "Es ist ein Fehler aufgetreten:\r\n" + exc.toString(), Feuerwehr.STR_VERSION, JOptionPane.ERROR_MESSAGE);
                System.exit(0);
            }
        }
        return conn;
    }  
    
    /**
     * Die Datenbankverbindung zurückgeben
     * @return Connection zur Datenbank
     */
    public static Connection getConnection() {
        return conn;
    }
    /**
     * Aus dem AnmeldeDialog die Daten übernehmen.
     * @param p Der authentifizierte Benutzer 
     */
    public static void setBenutzer(Person p) {
        pBenutzer = p;
    }

    /**
     * Den aktuellen Benutzer zurückgeben.
     * @return Person
     */
    public static Person getBenutzer() {
        return pBenutzer;
    }
    
    /**
     * Eine globale Formatierungsfunktion für eine Konvertierung Timestamp in String
     * @param t Der java.sql.Timestamp
     * @param f Eine gültige Formatmaske
     * @return Einen formatierten String
     */
    public static String formatDatum(Timestamp t, String f) {
        java.util.Date d = new java.util.Date(t.getTime());
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(f);
        return simpleDateFormat.format(d);        
//        return new SimpleDateFormat(f).format(new java.util.Date(t.getTime()));       // Kurzform :-)
    }

    /**
     * Implementierung eines Threads welcher alle fünf Sekunden die max Sequence testet.
     */
    @Override
    @SuppressWarnings("SleepWhileInLoop")
    public void run() {
        while (true) {
            int i = Einsatz.getSequence();
            if (i > maxSequence) {
                maxSequence = i;
                if (einsatzTabelle != null) {
                   if (einsatzTabelle.getAktualiserung() == true) {
                       einsatzTabelle.refreshAnzeige();
                   }
                }
            }
            try {
                Thread.sleep(5000);
            } catch (InterruptedException exc) {
                System.err.println("ERROR[FeuerwehrThread]: " + exc.toString());
            }
        }
    }
    
    private AnzeigeEinsatz anzeigeEinsatz = null;
    private EinsatzTabelle einsatzTabelle = null;
    private int maxSequence = -1;
    private static Connection conn;
    private static Person pBenutzer = null;
    public final static String STR_VERSION = "Feuerwehr 0.1.100 (MySQL)";    
}
